﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using ControlsLib;
using System.Linq.Expressions;
using LinqKit;
using GestionePolveriLib.BL;
using FrameworkLib.Filters;
using FrameworkLib.Facades.Paging;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class LottiPagedFacade : PagedFacadeBase<GestionePolveriEntities>
    {
        private int m_numberOfPages = 0;

        public LottiPagedFacade(int pageSize)
                    : base(pageSize)
        {

        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetLotti(), callback);
        }

        public void LoadAsyncS(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetLotti(), callback);
        }

        public void GetNumberOfPages()
        {
            this.CalcNumberOfPages((from x in this.GetContext().Lotti select x).Count());
        }

        public void GetNumberOfPages(FilterBase<Lotti> filter)
        {
            Expression<Func<Lotti, bool>> theFilter = filter.SetUpFilter();
            this.CalcNumberOfPages((from x in this.GetContext().Lotti.AsExpandable().Where(theFilter) select x).Count());
        }

        public List<Lotto> GetLotti(LottoLoadingModes loadingMode)
        {
            List<Lotto> retValue = null;

            var predicate = PredicateBuilder.True<Lotti>();

            switch (loadingMode)
            {
                case LottoLoadingModes.NotAssociated:
                    {
                        //predicate = PredicateBuilder.And<Lotti>(l => (l.NumFattura == null), l => (l.DataFattura == null));
                        //predicate = predicate.And(l => (l.NumFattura == null) && (l.DataFattura == null));
                        predicate = predicate.And(l => (l.NumFattura == null || l.NumFattura == ""));
                    }
                    break;
                case LottoLoadingModes.Associated:
                    {
                        //predicate = PredicateBuilder.And<Lotti>(l => (l.NumDdt != null), l => (l.DataDdt != null));
                        //predicate = predicate.And(l => (l.NumFattura != null) && (l.DataFattura != null));
                        predicate = predicate.And(l => (l.NumFattura != null && l.NumFattura != ""));
                    }
                    break;
                case LottoLoadingModes.All:
                    break;
                default:
                    break;
            }

            try
            {
                GestionePolveriEntities m_context = this.GetContext();
                var obj = from x in m_context.Lotti.AsExpandable().Where(predicate)
                          orderby x.DataDdt
                          select new Lotto
                          {
                              IDLotto = x.IDLotto,
                              CodLotto = x.CodLotto,
                              DataDdt = x.DataDdt,
                              NumDdt = x.NumDdt,
                              DataScadenzaLotto = x.DataScadenzaLotto,
                              Giacenza = x.Giacenza,
                              GiacenzaIniziale = x.Giacenza_iniziale,
                              IDPolvere = x.IDPolvere,
                              NumFattura = x.NumFattura,
                              DataFattura = x.DataFattura,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,
                              Fornitore = x.AnagPolveri.AnagFornitori.Descrizione,
                              PrezzoUnitario = x.PrezzoUnitario
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Lotto> GetLotti(FilterBase<Lotti> filter)
        {
            List<Lotto> retValue = null;

            GestionePolveriEntities m_context = this.GetContext();

            var obj = (from x in m_context.Lotti.AsExpandable().Where(filter.SetUpFilter())
                       orderby x.IDLotto ascending
                       select new Lotto
                       {
                           IDLotto = x.IDLotto,
                           CodLotto = x.CodLotto,
                           DataDdt = x.DataDdt,
                           NumDdt = x.NumDdt,
                           DataScadenzaLotto = x.DataScadenzaLotto,
                           Giacenza = x.Giacenza,
                           GiacenzaIniziale = x.Giacenza_iniziale,
                           IDPolvere = x.IDPolvere,
                           NumFattura = x.NumFattura,
                           DataFattura = x.DataFattura,
                           CodicePolvere = x.AnagPolveri.CodicePolvere,
                           Fornitore = x.AnagPolveri.AnagFornitori.Descrizione,
                           PrezzoUnitario = x.PrezzoUnitario
                       }).Skip(base.Skip).Take(base.PageSize);

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Lotto> GetLotti()
        {
            List<Lotto> retValue = null;

            GestionePolveriEntities m_context = this.GetContext();

            var obj = (from x in m_context.Lotti
                       orderby x.IDLotto ascending
                       select new Lotto
                       {
                           IDLotto = x.IDLotto,
                           CodLotto = x.CodLotto,
                           DataDdt = x.DataDdt,
                           NumDdt = x.NumDdt,
                           DataScadenzaLotto = x.DataScadenzaLotto,
                           Giacenza = x.Giacenza,
                           GiacenzaIniziale = x.Giacenza_iniziale,
                           IDPolvere = x.IDPolvere,
                           NumFattura = x.NumFattura,
                           DataFattura = x.DataFattura,
                           CodicePolvere = x.AnagPolveri.CodicePolvere,
                           Fornitore = x.AnagPolveri.AnagFornitori.Descrizione,
                           PrezzoUnitario = x.PrezzoUnitario
                       }).Skip(base.Skip).Take(base.PageSize);

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }
    }
}
